package com.cskaoyan.javase.array._6variable;

/**
 * 可变参数（variable parameter）
 * 是Java1.5时增加的新特性，当然我们已经在用Java8了，它一点也不新了。
 * 可变参数的用途不算非常多，但也是常见语法。
 * 可变参数适用于参数的数据类型确定,但是个数不确定的情况
 * 语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *   //方法体
 * }
 * 其中: "数据类型... 变量名"就是一个可变参数
 * 可变参数的实质是一个对应类型的数组,它是一个对应类型数组的形参变量.
 * 在带有可变参数的方法中,在方法体中,就直接可以把可变参数当成一个数组去处理.
 *
 * 在具体调用带有可变参数的方法时,可变参数的个数就可以任意输入了,这是因为在底层Java编译器会自动将这些可变参数变量封装成对应类型的一个数组
 *
 * 也就是说可变参数和数组实现的原理是一样的
 * 但是程序员少做了事情
 * 底层多做了事情
 * 实现原理不变
 * 这种语法,被称之为"语法糖"
 * 随着JDK版本的升级,语法糖越来越多
 *
 * @since 09:35
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        // System.out.println(getSum(arr));
        // getSum(1,2,3)

        System.out.println(getSum(1, 2));
        System.out.println(getSum(1, 2, 3));
        System.out.println(getSum(1, 2, 3, 4));
        System.out.println(getSum(arr));
    }


    /*
        需求: 求不确定个数的int类型参数之和
        以下传入数组的方法是可行的
        但是仍然不能满足需求
        我们希望能够在调用方法时,直接传入不确定个数的参数
        而不是需要先封装数组再传入
        这种需求怎么实现呢?
        需要使用可变参数
     */
    /*public static int getSum(int[] arr) {
        int sum = 0;
        for (int num : arr) {
            sum += num;
        }
        return sum;
    }*/

    // 使用可变参数实现以上功能
    // 'getSum(int...)' is already defined in 'com.cskaoyan.javase.array._6variable.Demo'
    public static int getSum(int... p) {
        int sum = 0;
        for (int num : p) {
            sum += num;
        }
        return sum;
    }
}
